home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Pascal / Source□ / Talk Source / TCP Libraries / UDPStuff.unit < prev   
Encoding:
Text File  |  1992-04-20  |  5.3 KB  |  189 lines  |  [TEXT/PJMM]

  1. unit UDPStuff;
  2.  
  3. { This program was written by Peter N Lewis, Mar 1992 in THINK Pascal 4.0.1 }
  4.  
  5. interface
  6.  
  7.     uses
  8.         TCPTypes;
  9.  
  10.     const
  11.         UDPDefaultBufferSize = 4048;
  12.  
  13.     type
  14.         UDPConnectionRecord = record
  15.                 magic: OSType;    { A magic number to try and avoid problems with released connection IDs. }
  16.                 stream: StreamPtr;
  17.                 outstanding: integer;
  18.             end;
  19.         UDPConnectionPtr = ^UDPConnectionRecord;
  20.  
  21.     function UDPInit: OSErr;
  22.     procedure UDPFinish;
  23.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  24.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  25.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  26.                                     var datap: ptr; var datalen: integer): OSErr;
  27.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  28.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  29.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  30.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  31.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  32.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  33.  
  34. implementation
  35.  
  36.     const
  37.         UDPMagic = 'UDPM';
  38.         UDPBad = '????';
  39.  
  40.     var
  41.         driver_refnum: integer;
  42.  
  43.     procedure ZeroCB (var cb: UDPControlBlock; stream: StreamPtr; call: integer);
  44.     { Zero out the control block parameters. }
  45.         var
  46.             i: integer;
  47.             p: longInt;
  48.     begin
  49.         for p := longInt(@cb) to longInt(@cb) + SizeOf(UDPControlBlock) - 1 do
  50.             ptr(p)^ := 0;
  51.         cb.udpStream := stream;
  52.         cb.ioCRefNum := driver_refnum;
  53.         cb.csCode := call;
  54.     end;
  55.  
  56.     function UDPInit: OSErr;
  57.         var
  58.             oe: OSErr;
  59.             i: integer;
  60.     begin
  61.         oe := OpenDriver('.IPP', driver_refnum);
  62.         UDPInit := oe;
  63.     end;
  64.  
  65.     procedure UDPFinish;
  66.     begin
  67.     end;
  68.  
  69.     procedure MyNotify (stream: streamPtr; eventCode: integer; connection: UDPConnectionPtr; icmpMsg: ptr);
  70.     begin
  71.         if eventCode = UDPDataArrival then
  72.             if connection^.magic = UDPMagic then
  73.                 connection^.outstanding := connection^.outstanding + 1;
  74.     end;
  75.  
  76.     function UDPCreateX (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  77.         var
  78.             oe: OSErr;
  79.             cb: UDPControlBlock;
  80.     begin
  81.         if buffer_size = 0 then
  82.             buffer_size := UDPDefaultBufferSize;
  83.         connection := UDPConnectionPtr(NewPtr(SizeOf(UDPConnectionRecord) + buffer_size));
  84.         oe := MemError;
  85.         if connection <> nil then begin
  86.             connection^.magic := UDPMagic;
  87.             ZeroCB(cb, nil, UDPcsCreate);
  88.             cb.create.rcvBuff := ptr(longInt(connection) + SizeOf(UDPConnectionRecord));
  89.             cb.create.rcvBuffLen := buffer_size;
  90.             cb.create.notifyProc := @MyNotify;
  91.             cb.create.userDataPtr := ptr(connection);
  92.             cb.create.localport := localport;
  93.             oe := PBControl(@cb, false);
  94.             localport := cb.create.localport;
  95.             connection^.stream := cb.udpStream;
  96.             connection^.outstanding := 0;
  97.         end;
  98.         UDPCreateX := oe;
  99.     end;
  100.  
  101.     function UDPCreate (var connection: UDPConnectionPtr; buffer_size: longInt; localport: integer): OSErr;
  102.     begin
  103.         UDPCreate := UDPCreateX(connection, buffer_size, localport);
  104.     end;
  105.  
  106.     function UDPCreateDynamic (var connection: UDPConnectionPtr; buffer_size: longInt; var localport: integer): OSErr;
  107.     begin
  108.         localport := 0;
  109.         UDPCreateDynamic := UDPCreateX(connection, buffer_size, localport);
  110.     end;
  111.  
  112.     function UDPRead (connection: UDPConnectionPtr; timeout: integer; var remoteIP: longInt; var remoteport: integer;{}
  113.                                     var datap: ptr; var datalen: integer): OSErr;
  114.         var
  115.             oe: OSErr;
  116.             cb: UDPControlBlock;
  117.     begin
  118.         ZeroCB(cb, connection^.stream, UDPcsRead);
  119.         cb.receive.timeout := timeout;
  120.         oe := PBControl(@cb, false);
  121.         if oe = noErr then
  122.             connection^.outstanding := connection^.outstanding - 1;
  123.         remoteIP := cb.receive.remoteIP;
  124.         remoteport := cb.receive.remoteport;
  125.         datap := cb.receive.rcvBuff;
  126.         datalen := cb.receive.rcvBuffLen;
  127.         UDPRead := oe;
  128.     end;
  129.  
  130.     function UDPReturnBuffer (connection: UDPConnectionPtr; datap: ptr): OSErr;
  131.         var
  132.             oe: OSErr;
  133.             cb: UDPControlBlock;
  134.     begin
  135.         ZeroCB(cb, connection^.stream, UDPcsBfrReturn);
  136.         cb.return.rcvBuff := datap;
  137.         oe := PBControl(@cb, false);
  138.         UDPReturnBuffer := oe;
  139.     end;
  140.  
  141.     function UDPDatagramsAvailable (connection: UDPConnectionPtr): integer;
  142.     begin
  143.         UDPDatagramsAvailable := connection^.outstanding;
  144.     end;
  145.  
  146.     function UDPWrite (connection: UDPConnectionPtr; remoteIP: longInt; remoteport: integer;{}
  147.                                     datap: ptr; datalen: integer; checksum: boolean): OSErr;
  148.         var
  149.             oe: OSErr;
  150.             cb: UDPControlBlock;
  151.             wds: wdsType;
  152.     begin
  153.         ZeroCB(cb, connection^.stream, UDPcsWrite);
  154.         cb.send.remoteIP := remoteIP;
  155.         cb.send.remotePort := remoteport;
  156.         wds.size := datalen;
  157.         wds.buffer := datap;
  158.         wds.term := 0;
  159.         cb.send.wds := @wds;
  160.         cb.send.checksum := ord(checksum);
  161.         oe := PBControl(@cb, false);
  162.         UDPWrite := oe;
  163.     end;
  164.  
  165.     function UDPRelease (var connection: UDPConnectionPtr): OSErr;
  166.         var
  167.             oe: OSErr;
  168.             cb: UDPControlBlock;
  169.     begin
  170.         ZeroCB(cb, connection^.stream, UDPcsRelease);
  171.         oe := PBControl(@cb, false);
  172.         connection^.magic := UDPBad;
  173.         DisposPtr(ptr(connection));
  174.         UDPRelease := oe;
  175.     end;
  176.  
  177.     function UDPMTU (remoteIP: longInt; var mtu: integer): OSErr;
  178.         var
  179.             oe: OSErr;
  180.             cb: UDPControlBlock;
  181.     begin
  182.         ZeroCB(cb, nil, UDPcsMaxMTUSize);
  183.         cb.mtu.remoteIP := remoteIP;
  184.         oe := PBControl(@cb, false);
  185.         mtu := cb.mtu.mtuSize;
  186.         UDPMTU := oe;
  187.     end;
  188.  
  189. end.